# coding: utf-8
import shelve
import flask
from datetime import datetime

INS_application = flask.Flask(__name__)

DATE_FILE = "MessBox_Test.dat"

def save_date(FP_name, FP_comment, FP_create_time):
    """【函 数】保存用户数据

        参数：
        + name: [str] 用户姓名
        + comment: [str] 用户评论
        + create_time: [datetime] 评论时间

        返回：
        + 无返回值
    """
    # 利用shelve模块打开数据库文件 Open the shelve module database file.
    INS_datebase = shelve.open(DATE_FILE)
    # 如果文件中没有greeting_list，则创建 If there is no greeting_list in database, create it.
    if "greeting_list" not in INS_datebase:
        greeting_list = []
    else:
        # Get the greeting_list from database.
        greeting_list = INS_datebase["greeting_list"]

    # 在数据库开头追加最新的用户数据
    greeting_list.insert(0, {"NAME": FP_name, "COMMENT": FP_comment, "TIME": FP_create_time})

    # 更新数据库 Update the datebase.
    INS_datebase["greeting_list"] = greeting_list

    # 关闭数据库文件 Close the datebase file.
    INS_datebase.close()


def load_date():
    """【函 数】保存用户数据

        参数：
        + 无参数

        返回：
        + 数据库格式的内容 [{"NAME", "COMMENT", "CREATE_TIME"}]
    """
    # 
    INS_datebase = shelve.open(DATE_FILE)
    #
    greeting_list = INS_datebase.get("greeting_list", [])

    # 关闭数据库文件 Close the datebase file
    INS_datebase.close()

    # 
    return greeting_list


@INS_application.route("/")
def index():
    """【函 数】启动首页
    """
    # greeting_list = load_date()
    return flask.render_template("index.html", greeting_list = load_date())


@INS_application.route("/post", methods=["POST"])
def post():
    """【函 数】评论的目标URL地址 Comment's target URL
    """
    # 获取评论数据 Get the comment data
    name = flask.request.form.get("TP_name")    # TP_前缀表示来自于模板
    comment = flask.request.form.get("TP_comment")  # TP_前缀表示来自于模板
    create_time = datetime.now()    # 获取当前时间
    # 保存数据 Save the data
    save_date(name, comment, create_time)
    # 重定向到首页 Redirect to the top page
    return flask.redirect("/")


# <调整模板输出>
@INS_application.template_filter("nl2br")
def nl2br_filters(s):
    """【函 数】
    Tranform the new line in comment to <br> tag
    """
    return flask.escape(s).replace("\n", Markup("</br>"))


@INS_application.template_filter("datetime_fmt")
def datetime_fmt_filter(dt):
    """【函 数】
    The fliter of making datetime to be shown friendly
    """
    return dt.strftime("%Y.%m.%d %H:%M:%S")
# </调整模板输出>


if __name__ == "__main__":
    #【模块内测试代码】
    def test_save():
        test_name = input("姓名：")
        test_comment = input("评论：")
        test_datetime = datetime.now()
        save_date(test_name, test_comment, test_datetime)
    
    def test_load():
        i = 1
        greeting_list = load_date()
        for data in greeting_list:
            print("【" + str(i) + "】")
            print(data)
            i = i + 1

    # test_save()   # 测试是否能保存数据
    # test_load()   # 测试是否能读取数据


    #【模块启动代码】
    # Run the application when the IP address is 172.21.0.6 and the port is 5000
    INS_application.run("172.21.0.6", 5000, debug=True) # 这里必须使用内网IP

